package 纯字符串;

import common.GeneralFunction;

import java.util.HashMap;
import java.util.Map;

public class No12整数转罗马数字 {

    /**
     * 罗马数字包含以下七种字符： I， V， X， L，C，D 和 M。
     * 字符          数值
     * I             1
     * V             5
     * X             10
     * L             50
     * C             100
     * D             500
     * M             1000
     * 例如， 罗马数字 2 写做 II ，即为两个并列的 1。12 写做 XII ，
     * 即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
     * 通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做 IIII，而是 IV。
     * 数字 1 在数字 5 的左边，所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地，数字 9 表示为 IX。
     * 这个特殊的规则只适用于以下六种情况：
     * I 可以放在 V (5) 和 X (10) 的左边，来表示 4 和 9。
     * X 可以放在 L (50) 和 C (100) 的左边，来表示 40 和 90。 
     * C 可以放在 D (500) 和 M (1000) 的左边，来表示 400 和 900。
     * 给定一个整数，将其转为罗马数字。输入确保在 1 到 3999 的范围内。
     *
     * 示例 1:
     * 输入: 3
     * 输出: "III"
     * 示例 2:
     * 输入: 4
     * 输出: "IV"
     * 示例 3:
     * 输入: 9
     * 输出: "IX"
     * 示例 4:
     * 输入: 58
     * 输出: "LVIII"
     * 解释: L = 50, V = 5, III = 3.
     * 示例 5:
     * 输入: 1994
     * 输出: "MCMXCIV"
     * 解释: M = 1000, CM = 900, XC = 90, IV = 4.
     */

    //非常拉跨的写法 搬砖式及不推荐;后方有很通俗易懂且简洁的写法
    public String intToRoman(int num) {

        Map<Integer, Character> map = new HashMap<>();
        map.put(1, 'I');
        map.put(5, 'V');
        map.put(10, 'X');
        map.put(50, 'L');
        map.put(100, 'C');
        map.put(500, 'D');
        map.put(1000, 'M');

        //代表 个 十 百 千 四位
        String strNum=String.valueOf(num);
        String[] resultArr=new String[strNum.length()];
        StringBuilder sb=new StringBuilder(strNum);
        strNum=sb.reverse().toString();

        for (int i = strNum.length()-1; i > 0; i--) {
            int number=strNum.charAt(i)-'0';
            int finalNumber= (int) (number*Math.pow(10,i));
            if(number==4){
                //先+1得到5,再得到1
                int tempNumber= (int) (finalNumber+1*Math.pow(10,i));
                Character c1 = map.get(tempNumber);//右边的
                Character c2 = map.get((int)Math.pow(10,i));//左边的
                resultArr[i]= String.valueOf(c2)+ c1;
            }else if(number==9){
                //先+1得到10,再得到1
                int tempNumber= (int) (finalNumber+1*Math.pow(10,i));
                Character c1 = map.get(tempNumber);//右边的
                Character c2 = map.get((int)Math.pow(10,i));//左边的
                resultArr[i]= String.valueOf(c2)+ c1;
            }else{
                //普通 1~3 5 6~8  0(跳)
                if(number==0){
                    resultArr[i]="";
                }else if(number<=3){

                    int tempNumber= (int) Math.pow(10,i);
                    Character c1 = map.get(tempNumber);
                    resultArr[i]="";
                    for (int j = 0; j < number; j++) {
                        resultArr[i]+=String.valueOf(c1);
                    }

                }else if(number==5){

                    resultArr[i]=String.valueOf(map.get(finalNumber));

                }else{
                    //6~8  先左再右
                    Character c2=  map.get((int) Math.pow(10,i)*5);//左边的
                    int tempNumber= (int) Math.pow(10,i);
                    Character c1 = map.get(tempNumber);//右边的
                    resultArr[i]=String.valueOf(c2);
                    for (int j = 0; j < number - 5; j++) {
                        resultArr[i]+=c1;
                    }
                }
            }
        }
        int number=strNum.charAt(0)-'0';
        if(number==0){
            resultArr[0]="";
        }else if(number==4){
            resultArr[0]="IV";
        }else if(number==9){
            resultArr[0]="IX";
        }else if(number<4){
            resultArr[0]="";
            for (int i = 0; i < number; i++) {
                resultArr[0]+="I";
            }
        }else{
            resultArr[0]="";
            resultArr[0]+="V";
            for (int i = 0; i < number - 5; i++) {
                resultArr[0]+="I";
            }
        }

        StringBuilder result= new StringBuilder();
        for (int i = resultArr.length-1; i >= 0; i--) {
            result.append(resultArr[i]);
        }

        return result.toString();
    }

    public String intToRomanGood(int num) {

        int[] numArr=new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};
        String[] romanArr=new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        StringBuilder stringBuilder=new StringBuilder();

        //把每个元素都遍历一遍
        for (int i = 0; i < numArr.length; i++) {

            while (num>=numArr[i]){
                stringBuilder.append(romanArr[i]);
                num-=numArr[i];
            }

        }

        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        GeneralFunction generalFunction=new GeneralFunction(No12整数转罗马数字.class,1997);
        generalFunction.runAllMethod();
    }

}
